home *** CD-ROM | disk | FTP | other *** search
- unit uVersionInformation;
- {
- Copyright ⌐ 2000, Synature
- Written by Brandon Smith
- }
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Controls, Forms, Dialogs;
-
- type
-
- tMSResourceNameEnum = (msFileVersion, msProductVersion, msFileDescription, msCompanyName, msComments,
- msInternalName, msLegalCopyright, msLegalTrademarks, msProductName, msOriginalFilename);
-
- TVersionInformation = class
- private
- FName: string;
- FLanguageIDString : string;
- FLanguageID: DWord;
- FLang: PInteger;
- FLangNum: integer;
- FVerInfo: pointer;
- FVerInfoSize: longint;
- fHasVerInfo: boolean;
- fErrMsg: string;
- procedure SetFileName(Value: string);
- function GetValue(aName: string): string;
- function getMsVerName(ndx: tMSResourceNameEnum): string;
- public
- //constructor Create(AOwner: TComponent); override;
- //destructor Destroy; override;
- class function instance : TVersionInformation;
- property Values[aName : string] : string read GetValue;
- property LanguageID: DWord read FLanguageID write FLanguageID;
- Property LanguageIDString : string read FLanguageIDString write FLanguageIDString;
- property FileName: string read FName write SetFileName;
- Property MSVerNames[ndx : tMSResourceNameEnum] : string read getMsVerName;
- Property HasVerInfo : boolean read fHasVerInfo;
- Property ErrorMessage : string read fErrMsg;
-
- end;
-
-
- const
- cUSEnglish = $040904E4;
-
- var
- VerInfo : TVersionInformation;
-
- implementation
- uses TypInfo;
-
- class function TVersionInformation.instance: TVersionInformation;
- begin
- if not assigned(VerInfo)
- then VerInfo := TVersionInformation.Create;
- result := VerInfo;
- end;
-
-
- procedure TVersionInformation.SetFileName(Value: string);
- var
- len: DWord;
- begin
- fName := value;
- if fVerInfoSize > 0
- then begin
- FreeMem(fVerInfo, fVerInfoSize);
- fVerInfoSize := 0;
- end;
- if not FileExists(fname)
- then begin
- fErrMsg := 'File '+fname+' not found by version information object.';
- fHasVerInfo := false;
- exit;
- end;
- fVerInfoSize := GetFileVersionInfoSize(pchar(fname), len);
- if fVerInfoSize > 0
- then begin
- fHasVerInfo := true;
- GetMem(fVerInfo, fVerInfoSize);
- if not GetFileVersionInfo(pchar(fname), len, fVerInfoSize, fVerInfo)
- then begin
- fErrMsg := 'Cannot retrieve Version Information for ' + fname;
- fHasVerInfo := false;
- end;
- // get languages
- VerQueryValue(fVerInfo, '\VarFileInfo\Translation', pointer(FLang), len);
- if flang = nil
- then begin
- fErrMsg := 'No language pointer in version information for ' +fname;
- fHasVerInfo := false;
- end;
- FLangNum := len div 4;
- end
- else begin
- fErrMsg := 'Ver Info size call failed for '+fname;
- fHasVerInfo := false;
- end;
- end;
-
-
- const
- queryFmt = '\StringFileInfo\%4.4x%4.4x\%s';
-
- function TVersionInformation.GetValue(aName: string): string;
- var
- ptr: pchar;
- len: DWord;
- begin
- Result := EmptyStr;
- if fVerInfoSize <= 0
- then begin
- fErrMsg := 'VerInfo object not initialized for '+fname;
- fHasVerInfo := false;
- exit;
- end;
- if VerQueryValue(fVerInfo, pchar(Format(queryFmt, [LoWord(FLang^), HiWord(FLang^), aName])), pointer(ptr), len)
- then Result := ptr;
- end;
-
- function TVersionInformation.getMsVerName(
- ndx: tMSResourceNameEnum): string;
- var EnumType : PTypeInfo;
- begin
- EnumType := TypeInfo(tMSResourceNameEnum);
- result := GetEnumName(EnumType, ord(ndx) );
- system.delete(result, 1, 2);
- end;
-
- Initialization
- VerInfo := TVersionInformation.create;
- VerInfo.LanguageID := cUSEnglish;
-
- Finalization
- VerInfo.free;
-
-
- end.
-